package zhcms.framework.dao;

public class GyLinkTables {
	GyForData nodeData = new GyForData();
	GyLinkTables nextNode;

	@SuppressWarnings("unused")
	GyLinkTables CLAddEnd(GyLinkTables head, GyForData nodeData) // 追加结点
	{
		GyLinkTables node, htemp;
		if ((node = new GyLinkTables()) == null) {
			System.out.println("申请内存失败！");
			return null;
		} else {
			node.nodeData = nodeData; // 保存数据
			node.nextNode = null; // 设置结点引用为空，即为表尾
			if (head == null) // 头引用
			{
				head = node;
				return head;

			}
			htemp = head;
			while (htemp.nextNode != null) // 查找链表的末尾
			{
				htemp = htemp.nextNode;
			}
			htemp.nextNode = node;
			return head;
		}

	}
	
	@SuppressWarnings("unused")
	GyLinkTables CLAddFirst(GyLinkTables head,GyForData nodeData)		//在头结点增加结点
	{
		GyLinkTables node;
		if((node = new GyLinkTables()) == null)
		{
			System.out.println("申请内存失败！");
			return null;
		}
		else
		{
			node.nodeData = nodeData;					//保存数据
			node.nextNode = head;						//指向头引用所指结点
			head = node;								//头引用指向新增结点
			return head;
		}		
	}
	
	GyLinkTables CLFindNode(GyLinkTables head,String key)		//查找结点
	{
		GyLinkTables htemp;								
		htemp = head;								//保存链表头引用
		while(htemp != null)						//若结点有效，则进行查找
		{
			if(htemp.nodeData.keyword.compareTo(key)==0)	//若结点关键字与传入的关键字相同
			{
				return htemp;						//返回该结点引用
			}
			htemp = htemp.nextNode;					//处理下一结点
		}
		return null;
	}
	
	@SuppressWarnings("unused")
	GyLinkTables CLInsertNode(GyLinkTables head,String findkey,GyForData nodeData)	//插入结点
	{
		GyLinkTables node,nodetemp;
		if((node = new GyLinkTables())==null)				//分配内存结点的内容
		{
			System.out.println("申请内存 失败!");
			return null;
			
		}
		node.nodeData = nodeData;					//保存结点中的数据
		nodetemp = CLFindNode(head,findkey);
		if(nodetemp!=null)							//若找到要插入的结点
		{
			node.nextNode = nodetemp.nextNode;		//新插入结点指向关键结点的下一节点
			nodetemp.nextNode = node;				//设置关键结点指向新插入结点
			
		}
		else 
		{
			System.out.println("未找到正确的插入位置!");
			//free(node);								//释放内存
		}
		return head;
		
	}
	
	int CLDeleteNode(GyLinkTables head,String key)			//删除结点
	{
		GyLinkTables node,htemp;
		htemp = head;
		node = head;
		while(htemp!=null)
		{
			if(htemp.nodeData.keyword.compareTo(key)==0)
			{
				node.nextNode=htemp.nextNode;			//使前一节点指向当前结点的下一节点
				//free(htemp);							//释放内存
				return 1;
			}
			else
			{
				node = htemp;							//指向当前结点
				htemp = htemp.nextNode;					//指向下一节点
			}
			
		}
		return 0;
	}
	
	int CLLength(GyLinkTables head)							//计算链表长度
	{
		GyLinkTables htemp;
		int len = 0;
		htemp = head;
		while(htemp!=null)								//遍历整个链表
		{
			len ++;
			htemp = htemp.nextNode;						//处理下一结点
		}
		return len;
		
	}
	
	void CLAllNode(GyLinkTables head)							//显示链表
	{
		GyLinkTables htemp;
		GyForData nodeData ;
		htemp = head;
		System.out.printf("当前链表共有%d个结点。链表所有数据如下：\n",CLLength(head));
		while(htemp != null)							//循环处理链表每个结点
		{
			nodeData = htemp.nodeData;
			System.out.printf("结点（[%s],[%s],[%s],%d）\n",nodeData.id,nodeData.keyword,nodeData.content,nodeData.depth);
			htemp = htemp.nextNode;
		}
	}
}
